#ifndef _WX_FRAME_H_BASE_
#define _WX_FRAME_H_BASE_

// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------

#include "wx/toplevel.h"      // the base class

// the default names for various classs
extern const wxChar wxStatusLineNameStr[];
extern const wxChar wxToolBarNameStr[];

class wxFrame;
class wxMenuBar;
class wxStatusBar;
class wxToolBar;

// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------

// wxFrame-specific (i.e. not for wxDialog) styles
#define wxFRAME_NO_TASKBAR      0x0002  // No taskbar button (MSW only)
#define wxFRAME_TOOL_WINDOW     0x0004  // No taskbar button, no system menu
#define wxFRAME_FLOAT_ON_PARENT 0x0008  // Always above its parent
#define wxFRAME_SHAPED          0x0010  // Create a window that is able to be shaped

class wxFrameBase : public wxTopLevelWindow {
  public:
    // construction
    wxFrameBase();
    virtual ~wxFrameBase();

    wxFrame *New( wxWindow *parent,
                  wxWindowID winid,
                  const wxString& title,
                  const wxPoint& pos = wxDefaultPosition,
                  const wxSize& size = wxDefaultSize,
                  long style = wxDEFAULT_FRAME_STYLE,
                  const wxString& name = wxFrameNameStr );

    // frame state
    // -----------

    // get the origin of the client area (which may be different from (0, 0)
    // if the frame has a toolbar) in client coordinates
    virtual wxPoint GetClientAreaOrigin() const;

    // sends a size event to the window using its current size -- this has an
    // effect of refreshing the window layout
    virtual void SendSizeEvent();
    virtual void SetMenuBar( wxMenuBar *menubar );
    virtual wxMenuBar *GetMenuBar() const { return m_frameMenuBar; }

    // process menu command: returns true if processed
    bool ProcessCommand( int winid );

    // status bar functions
    // --------------------
    #if wxUSE_STATUSBAR
    // create the main status bar by calling OnCreateStatusBar()
    virtual wxStatusBar* CreateStatusBar( int number = 1,
                                          long style = wxST_SIZEGRIP | wxFULL_REPAINT_ON_RESIZE,
                                          wxWindowID winid = 0,
                                          const wxString& name =
                                            wxStatusLineNameStr );
    // return a new status bar
    virtual wxStatusBar *OnCreateStatusBar( int number,
                                            long style,
                                            wxWindowID winid,
                                            const wxString& name );
    // get the main status bar
    virtual wxStatusBar *GetStatusBar() const { return m_frameStatusBar; }

    // sets the main status bar
    virtual void SetStatusBar( wxStatusBar *statBar );

    // forward these to status bar
    virtual void SetStatusText( const wxString &text, int number = 0 );
    virtual void SetStatusWidths( int n, const int widths_field[] );
    void PushStatusText( const wxString &text, int number = 0 );
    void PopStatusText( int number = 0 );

    // set the status bar pane the help will be shown in
    void SetStatusBarPane( int n ) { m_statusBarPane = n; }
    int GetStatusBarPane() const { return m_statusBarPane; }
    #endif // wxUSE_STATUSBAR

    // toolbar functions
    // -----------------

    #if wxUSE_TOOLBAR
    // create main toolbar bycalling OnCreateToolBar()
    virtual wxToolBar* CreateToolBar( long style = -1,
                                      wxWindowID winid = wxID_ANY,
                                      const wxString& name = wxToolBarNameStr );
    // return a new toolbar
    virtual wxToolBar *OnCreateToolBar( long style, wxWindowID winid, const wxString& name );

    // get/set the main toolbar
    virtual wxToolBar *GetToolBar() const { return m_frameToolBar; }
    virtual void SetToolBar( wxToolBar *toolbar );
    #endif // wxUSE_TOOLBAR

    #if wxUSE_STATUSBAR
    void OnMenuOpen( wxMenuEvent& event );
    void OnMenuClose( wxMenuEvent& event );
    void OnMenuHighlight( wxMenuEvent& event );
    #endif // wxUSE_STATUSBAR
    virtual void DoMenuUpdates( wxMenu* menu = NULL );

    // do the UI update processing for this window
    virtual void UpdateWindowUI( long flags = wxUPDATE_UI_NONE );

    // Implement internal behaviour (menu updating on some platforms)
    virtual void OnInternalIdle();

    // if there is no real wxTopLevelWindow on this platform we have to define
    // some wxTopLevelWindowBase pure virtual functions here to avoid breaking
    // old ports (wxMotif) which don't define them in wxFrame
    #ifndef wxTopLevelWindowNative
    virtual bool ShowFullScreen( bool WXUNUSED( show ),
                                 long WXUNUSED( style ) = wxFULLSCREEN_ALL ) { return false; }
    virtual bool IsFullScreen() const
    { return false; }
    #endif // no wxTopLevelWindowNative

    #if wxUSE_MENUS || wxUSE_TOOLBAR
    // show help text (typically in the statusbar); show is false
    // if you are hiding the help, true otherwise
    virtual void DoGiveHelp( const wxString& text, bool show );
    #endif

  protected:
    void DeleteAllBars();
    virtual bool IsOneOfBars( const wxWindow *win ) const;
    virtual void PositionMenuBar() { }
    virtual void DetachMenuBar();
    virtual void AttachMenuBar( wxMenuBar *menubar );
    wxMenuBar *m_frameMenuBar;

    #if wxUSE_STATUSBAR && (wxUSE_MENUS || wxUSE_TOOLBAR)
    // the saved status bar text overwritten by DoGiveHelp()
    wxString m_oldStatusText;
    #endif

    #if wxUSE_STATUSBAR
    // override to update status bar position (or anything else) when
    // something changes
    virtual void PositionStatusBar() { }

    // show the help string for this menu item in the given status bar: the
    // status bar pointer can be NULL; return true if help was shown
    bool ShowMenuHelp( wxStatusBar *statbar, int helpid );

    wxStatusBar *m_frameStatusBar;
    #endif // wxUSE_STATUSBAR


    int m_statusBarPane;

    #if wxUSE_TOOLBAR
    // override to update status bar position (or anything else) when
    // something changes
    virtual void PositionToolBar() { }

    wxToolBar *m_frameToolBar;
    #endif // wxUSE_TOOLBAR

    #if wxUSE_MENUS && wxUSE_STATUSBAR
    DECLARE_EVENT_TABLE()
    #endif // wxUSE_MENUS && wxUSE_STATUSBAR

    DECLARE_NO_COPY_CLASS( wxFrameBase )
};

// include the real class declaration
#if defined(__WXUNIVERSAL__) // && !defined(__WXMICROWIN__)
#include "wx/univ/frame.h"
#else // !__WXUNIVERSAL__
#include "wx/gtk/frame.h"
#endif

#endif
// _WX_FRAME_H_BASE_
